package com.le.tester.imooc.masterJUC.threadlocal;

/**
 * 描述：使用ThreadLocal，避免传递参数的麻烦
 */
public class ThreadLocalNormalUsage06 {
    public static void main(String[] args) {
        new Service1().process();
    }

}

class Service1 {
    public void process() {
        User user = new User("LLL");
        //把信息放进了holder
        UserContextHolder.holder.set(user);
        //层层传递
        new Service2().process();

    }
}

class Service2 {
    public void process() {
        //不用重复的创建对象了,直接从holder获取
        //在没有set的情况下，那么就会initialValue()
        User user = UserContextHolder.holder.get();
        System.out.println("service2 user name is " + user.name);
        //层层传递
        //service3拿不到user name,使用了remove
        //这边set的value是一个强的引用，因此在使用完之后，应该调用remove方法，来让value=null。释放内存。
        UserContextHolder.holder.remove();
        User user1 = new User("KKK");
        //把信息放进了holder
        UserContextHolder.holder.set(user1);
        new Service3().process();
    }
}

class Service3 {
    public void process() {
        //不用重复的创建对象了,直接从holder获取
        User user = UserContextHolder.holder.get();
        System.out.println("service3 user name is " + user.name);
        //应该使用remove方法，来释放内存，让引用指向null
        UserContextHolder.holder.remove();


    }
}

//user信息的持有者
class UserContextHolder {

    public static ThreadLocal<User> holder = new ThreadLocal<>();

}

class User {
    public String name;

    public User(String name) {
        this.name = name;
    }


}